package com.test30_IO流;

import org.junit.Test;

import java.io.File;
import java.io.RandomAccessFile;

/**
 * RandomAccessFile，随机访问文件
 */
public class Demo11_RandomAccessFile {
    private static final int MAX_LENGTH = 8;    // 数据的最大长度

    /**
     * 实现随机写入
     */
    @Test
    public void test1() throws Exception {
        File file = new File("F:" + File.separator + "muyan" + File.separator + "yootk.data");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();  // 创建父目录
        }
        RandomAccessFile raf = new RandomAccessFile(file, "rw");    // 读写模式进行输入
        String[] names = new String[] {"zhangsan", "lisi", "wangwu", "zhaoliu", "sunqi"};
        int[] ages = new int[] {17, 18, 16, 19, 20};
        for (int x = 0; x < names.length; x++) {
            String name = addEscape(names[x]);
            raf.write(name.getBytes());
            raf.writeInt(ages[x]);
        }
        raf.close();
    }

    /**
     * 读取二进制的随机文件
     */
    @Test
    public void test2() throws Exception {
        File file = new File("F:" + File.separator + "muyan" + File.separator + "yootk.data");
        if (file.exists()) {
            RandomAccessFile raf = new RandomAccessFile(file, "r");     // 采用读模式，进行处理
            {   // 读取第2条内容
                raf.skipBytes(12);  // 跳过12个字节
                byte[] data = new byte[MAX_LENGTH];
                raf.read(data);
                int age = raf.readInt();
                System.out.printf("【第2条数据】姓名：%s、年龄：%d\n", new String(data).trim(), age);
            }
            {   // 读取第1条内容
                raf.seek(0);    // 回到指定索引位置
                byte[] data = new byte[MAX_LENGTH];
                raf.read(data);
                int age = raf.readInt();
                System.out.printf("【第1条数据】姓名：%s、年龄：%d\n", new String(data).trim(), age);
            }
            {   // 读取第5条内容
                raf.skipBytes(12*3);
                byte[] data = new byte[MAX_LENGTH];
                raf.read(data);
                int age = raf.readInt();
                System.out.printf("【第5条数据】姓名：%s、年龄：%d\n", new String(data).trim(), age);
            }
            raf.close();
        }
    }

    /**
     * 补充空格
     * @param val
     * @return
     */
    public static String addEscape(String val) {
        StringBuffer buffer = new StringBuffer(val);
        while (buffer.length() < MAX_LENGTH) {
            buffer.append(" "); // 在内容后追加空格
        }
        return buffer.toString();
    }
}
